package object3;

/**
 * 设计模式-懒汉式
 */
public class SingleTon02 {

    public static void main(String[] args) {

        /*
            懒汉式和硬汉式区别：
            1)创建对象的时机不同：饿汉式是在类加载就创建了对象实例，而懒汉式是使用时才创建、
            2)饿汉式不存在线程安全问题，懒汉式存在线程安全问题
            3)饿汉式存在浪费资源的可能
            4)Runtime类就是经典的单例模式
         */

        Cats instance = Cats.getInstance();
        System.out.println(instance);

        //再次调用getInstance
        Cats instance2 = Cats.getInstance();
        System.out.println(instance2);

        System.out.println(instance == instance2); // true
    }
}

class Cats {

    private String name;

    public static int n1 = 999;

    private static Cats cats;//默认是null

    //仍然构造器私有化，定义一个static静态属性对象，提供一个public的静态方法可以返回一个Cats对象
    //只有当用户使用getInstance()时，才返回Cats对象，后面再次调用时，会返回上次创建的cat对象

    private Cats(String name) {
        System.out.println("构造器被调用...");
        this.name = name;
    }

    public static Cats getInstance() {

        if (cats == null) {//如果还没有创建cat对象
            cats = new Cats("小可爱");
        }
        return cats;
    }

    @Override
    public String toString() {
        return "Cats{" +
                "name='" + name + '\'' +
                '}';
    }
}